package BasicClass.Four;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;

public class Test_Ten {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String[] split = bf.readLine().split(",");
        RandomListNode pre = new RandomListNode(0);
        RandomListNode phead = pre;
        HashMap<Integer, RandomListNode> map = new HashMap<>();
        for (int i = 0; i < split.length/2; i++) {
            phead.next = new RandomListNode(Integer.parseInt(split[i]));
            phead = phead.next;
            map.put(phead.label,phead);
        }
        RandomListNode tampNode = pre.next;
        for (int i = split.length/2; i < split.length; i++) {
            Integer ranVal = split[i].equals("#")?null:Integer.parseInt(split[i]);
            tampNode.random = map.get(ranVal);
            tampNode = tampNode.next;
        }
        RandomListNode node = Clone(pre.next);
        while (node != null){
            System.out.print(node.label+"   and    ");
            if(node.random==null){
                System.out.print(null+"---->");
            }else {
                System.out.print(node.random.label+"---->");
            }
            node = node.next;
        }
    }

    /**
     * 输入一个复杂链表（每个节点中有节点值，以及两个指针，一个指向下一个节点，另一个特殊指针random指向一个随机节点），
     * 请对此链表进行深拷贝，并返回拷贝后的头结点。（注意，输出结果中请不要返回参数中的节点引用，否则判题程序会直接返回空）
     * @param pHead
     * @return
     * 思路：创建一个新的节点，将所有节点信息放到map中，
     * 将每个节点根据原始链表之间的关系串联起来
     */
    public static RandomListNode Clone(RandomListNode pHead) {
        RandomListNode cNode = pHead;
        HashMap<RandomListNode, RandomListNode> map = new HashMap<>();
        while (cNode != null){
            map.put(cNode,new RandomListNode(cNode.label));//将所有节点放置进去，可以K中获取每个节点的next、random，再通过V获取新节点，并串联起来
            cNode = cNode.next;
        }
        RandomListNode resNode = pHead;
        while (resNode != null){//将每个节点的next、random，依据原始链表串联起来
            map.get(resNode).next = map.get(resNode.next);
            map.get(resNode).random = map.get(resNode.random);
            resNode = resNode.next;
        }
        return map.get(pHead);
    }


    static class RandomListNode{
        int label;
        RandomListNode next = null;
        RandomListNode random = null;

        RandomListNode(int label) {
            this.label = label;
        }
    }

}
